home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 19 / CD_ASCQ_19_010295.iso / dos / prg / pas / swag / printing.swg / 0014_Write to CON and PRN.pas < prev    next >
Pascal/Delphi Source File  |  1993-06-22  |  5KB  |  242 lines

  1. UNIT ConPrnIO;
  2. { UNIT TO WRITE TO SCREEN AND PRINTER AT THE SAME TIME }
  3.  
  4. INTERFACE
  5.  
  6.   USES DOS;
  7.   VAR
  8.     ConPrn : Text;
  9.  
  10.   PROCEDURE SetLptNbr(PrinterPort: Byte);
  11.  
  12. IMPLEMENTATION
  13.  
  14.   VAR
  15.     IOBuffer : ARRAY[0..255] OF Char;
  16.     OldExitProc : Pointer;
  17.  
  18. {$F+}
  19.   PROCEDURE ExitConPrn;
  20.   BEGIN
  21.     ExitProc := OldExitProc;
  22.     Close(ConPrn)
  23.   END;
  24.  
  25. {------------------------------}
  26.  
  27.   PROCEDURE SetLptNbr;
  28.  
  29.       FUNCTION NbrLpts: Integer;
  30.       VAR
  31.         Regs : Registers;
  32.       BEGIN
  33.         Intr($11,Regs);
  34.         NbrLpts := Regs.AH SHR 6
  35.       END;
  36.  
  37.  
  38.   BEGIN
  39.     IF NbrLpts = 0 THEN
  40.       BEGIN
  41.         WriteLn('No printer port installed');
  42.         Halt(1)
  43.       END;
  44.  
  45.     WITH TextRec(ConPrn) DO
  46.       BEGIN
  47.         IF PrinterPort <= NbrLpts THEN
  48.           UserData[1] := PrinterPort - 1
  49.         ELSE
  50.           UserData[1] := 0  {Default to LPT1}
  51.       END
  52.   END;
  53.  
  54. {------------------------------}
  55.  
  56.   FUNCTION OutPrn(VAR F: TextRec; ch : Char):
  57.                                          Integer;
  58.     FUNCTION GetPrnStatus(PrnPort: Byte): Boolean;
  59.  
  60.       VAR
  61.         Regs : Registers;
  62.         NbrPasses : Byte;
  63.       CONST
  64.         Retries : Byte = 100;
  65.  
  66.       BEGIN
  67.  
  68.         NbrPasses := 0;
  69.         GetPrnStatus := TRUE;
  70.  
  71.         WITH Regs DO
  72.           BEGIN
  73.             REPEAT
  74.                AH := $02;
  75.                DX := F.UserData[1];
  76.                Intr($17,Regs);
  77.                AH := AH AND $90;
  78.                IF (AH <> $90) AND
  79.                   (NbrPasses < Retries) THEN
  80.                  Inc(NbrPasses)
  81.             UNTIL (NbrPasses > Retries) OR
  82.                   (AH = $90);
  83.             IF AH <> $90 THEN
  84.                GetPrnStatus := FALSE;
  85.           END
  86.       END;
  87.  
  88.  
  89.     VAR
  90.       Regs : Registers;
  91.       ChByte : Byte;
  92.  
  93.     BEGIN
  94.       ChByte := Ord(ch);
  95.       WITH Regs DO
  96.         BEGIN
  97.           IF GetPrnStatus(F.UserData[1]) THEN
  98.             BEGIN
  99.               AH := $00;
  100.               AL := ChByte;
  101.               DX := F.UserData[1];
  102.               Intr($17,Regs);
  103.               OutPrn := 0;
  104.             END
  105.           ELSE
  106.             OutPrn := 160
  107.         END
  108.       END;
  109.  
  110. {------------------------------}
  111.  
  112.   FUNCTION InOutConPrn(VAR F: TextRec): Integer;
  113.  
  114.  
  115.     PROCEDURE OutCon(ch : Char; DspPage : Byte);
  116.     VAR
  117.       Regs : Registers;
  118.     BEGIN
  119.       Regs.AH := $0E;        {Write TTY character}
  120.       Regs.AL := Byte(ch);
  121.       Regs.BH := DspPage;
  122.       Intr($10,Regs)
  123.     END;
  124.  
  125.  
  126.   VAR
  127.     OutputPos, DspPage : Byte;
  128.     Regs               : Registers;
  129.     Status               : Integer;
  130.  
  131.   BEGIN
  132.     WITH F DO
  133.       BEGIN
  134.         Regs.AH := $0F; {Get Current Display Page}
  135.         Intr($10,Regs);
  136.         DspPage := Regs.BH;
  137.         OutputPos := 0;
  138.         Status := 0;
  139.         InOutConPrn := 0;
  140.         WHILE (OutputPos < BufPos) AND
  141.               (Status = 0) DO
  142.           BEGIN
  143.             OutCon(BufPtr^[OutputPos],DspPage);
  144.             Status := OutPrn(F,BufPtr^[OutputPos]);
  145.             Inc(OutputPos);
  146.             IF Status <> 0 THEN
  147.               InOutConPrn := 160;
  148.           END;
  149.         BufPos := 0;
  150.       END
  151.   END;
  152.  
  153. {------------------------------}
  154.  
  155.   FUNCTION FlushConPrn(VAR F: TextRec): Integer;
  156.   BEGIN
  157.     WITH F DO
  158.       BEGIN
  159.         IF BufPos <> 0 THEN
  160.           FlushConPrn := InOutConPrn(F)
  161.         ELSE
  162.           FlushConPrn := 0
  163.       END
  164.   END;
  165.  
  166. {------------------------------}
  167.  
  168.   FUNCTION CloseConPrn(VAR F: TextRec): Integer;
  169.   {print a ff on printer when closing device}
  170.   BEGIN
  171.     IF F.UserData[1] < 3 THEN
  172.        CloseConPrn := OutPrn(F,Chr(12))
  173.   END;
  174.  
  175. {------------------------------}
  176.  
  177.   FUNCTION OpenConPrn(VAR F: TextRec): Integer;
  178.   BEGIN
  179.     WITH F DO
  180.       BEGIN
  181.         IF Mode = fmOutput THEN
  182.           BEGIN
  183.             InOutFunc        := @InOutConPrn;
  184.             FlushFunc        := @FlushConPrn;
  185.             CloseFunc        := @CloseConPrn;
  186.             FillChar(IOBuffer,SizeOf(IOBuffer),#0);
  187.             OpenConPrn        := 0
  188.           END
  189.         ELSE
  190.           OpenConPrn := 104 {file not open
  191.                              for input or Append}
  192.       END
  193.   END;
  194.  
  195. {$F-}
  196.  
  197. {------------------------------}
  198.  
  199.  
  200.   PROCEDURE AssignConPrn(VAR F : Text);
  201.  
  202.   BEGIN
  203.      WITH TextRec(F) DO
  204.        BEGIN
  205.          Mode             := fmClosed;
  206.          BufSize     := SizeOf(IOBuffer);
  207.          BufPtr             := @IOBuffer;
  208.          OpenFunc    := @OpenConPrn;
  209.          Name[0]     := #0
  210.        END
  211.   END;
  212.  
  213. {-------- UNIT INITIALIZATION SECTION ---------}
  214.  
  215.  
  216. BEGIN
  217.   AssignConPrn(ConPrn);
  218.   Rewrite(ConPrn);
  219.  
  220.   OldExitProc := ExitProc;
  221.   ExitProc := @ExitConPrn;
  222.  
  223.   SetLptNbr(1);               {default to LPT1}
  224. END.
  225.  
  226. { ------------------    TEST PROGRAM ------------------------}
  227.  
  228. PROGRAM TestConPrn;
  229.  
  230.  
  231. USES DOS,CRT,Printer,ConPrnIO;
  232.  
  233.  
  234. BEGIN
  235.   ClrScr;
  236.   WriteLn('Written to screen');
  237.   WriteLn(ConPrn,'Written to both');
  238.   WriteLn('Written to screen');
  239.   WriteLn(Lst,'Written to printer only')
  240. END.
  241.  
  242.